package com.zhouxiaoge.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;


/****************************************************************
 卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍
 卐卐卐                    _ooOoo_                    卍卍卍卍卍卍
 卐卐卐      卐           o8888888o          卍       * 佛  卍卍卍
 卐卐卐                  88'' . ''88                  * 祖  卍卍卍
 卐卐卐                  ( | -_- | )                  * 保  卍卍卍
 卐卐卐                   0\  =  /0                   * 佑  卍卍卍
 卐卐卐                ____/'---'\____                *     卍卍卍
 卐卐卐              .'  \\|     |//  '.              * 永  卍卍卍
 卐卐卐             /  \\|||  :  |||//  \             * 无  卍卍卍
 卐卐卐            /  _||||| -:- |||||-  \            * BUG 卍卍卍
 卐卐卐            |   | \\\  -  /// |   |            *     卍卍卍
 卐卐卐            | \_|  ''\---/''  |   |            * 阿  卍卍卍
 卐卐卐            \  .-\__  `-`  ___/-. /            * 弥  卍卍卍
 卐卐卐          ___`. .'  /--.--\  `. . __           * 陀  卍卍卍
 卐卐卐        ."" '<  ‘.___\_<|>_/___.’  >'"".     * 佛  卍卍卍
 卐卐卐       | | :  ` - `.;`\ _ /`;.`/ - ` : | |     卍卍卍卍卍卍
 卐卐卐       | \ `-.   \_ __\ /__ _/   .-`  / /      卍卍卍卍卍卍
 卐卐卐 ======`-.____`-.___\_____/___.-`____.-'=======卍卍卍卍卍卍
 卐@author 周明阳 mail:gqzmy@outlook.com 时间:2019-06-21 10:15卍卍
 卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍卐卍
 *
 *
 */

public class Lamdba2Test {

    // 无参数，无返回值
    @Test
    public void test1() {

        //jdk 1.7之前，必须声明final,jdk 1.8 可以省略不写
        int num = 0;
        // 匿名内部类
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World ！" + num);
            }
        };
        runnable.run();

        // Lamdba表达式
        Runnable lamdba = () -> System.out.println("Hello Lamdba ! " + num);
        lamdba.run();
    }

    // 有一个参数，无返回值
    @Test
    public void test2() {
        Consumer<String> con = (x) -> System.out.println(x);
        con.accept("有一个参数，无返回值！");
    }

    // 若只有一个参数，小括号可以省略
    @Test
    public void test3() {
        Consumer<String> consumer = System.out::println;
        consumer.accept("若只有一个参数，小括号可以省略");
    }

    // 若有两个以上参数，有返回值，且Lamdba体中有多条语句
    @Test
    public void test4() {
        Comparator<Integer> comparator = (x, y) -> {
            System.out.println("函数式接口");
            return Integer.compare(x, y);
        };
        int compare = comparator.compare(1, 2);
        System.out.println(compare);
    }

    //若Lamdba体中只有一条语句，return和大括号都可以省略不写
    @Test
    public void test5() {
        Comparator<Integer> comparator1 = (x, y) -> Integer.compare(x, y);
        System.out.println(comparator1.compare(1, 1));
        Comparator<Integer> comparator2 = Integer::compare;
        System.out.println(comparator2.compare(2, 1));
    }

    // Lamdba表达式的参数列表的数据类型可以省略不写，因为JVM编译器通过上下文推断数据类型，即类型推断
    @Test
    public void test() {
        Integer square = operation(100, x -> x * x);
        System.out.println(square);
        Integer cube = operation(2, x -> x * x * x);
        System.out.println(cube);
    }

    private Integer operation(Integer num, MyFun myFun) {
        return myFun.getValue(num);
    }
}
